fetch "shared with me" information separately
authorJyrki Gadinger <nilsding@nilsding.org>
Fri, 10 Jan 2025 12:53:17 +0000 (13:53 +0100)
committerJyrki Gadinger <nilsding@nilsding.org>
Fri, 7 Feb 2025 08:22:07 +0000 (09:22 +0100)
if the parameter `shared_with_me` is set to `"true"` on the shares API
call the response will only include that and not return any other
sharing information.  therefore let's fetch it inside another job (this
is also how the web client does it).

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
src/gui/filedetails/sharemodel.cpp
src/gui/filedetails/sharemodel.h
src/gui/ocssharejob.cpp
src/gui/ocssharejob.h
src/gui/sharemanager.cpp
src/gui/sharemanager.h

index b7336c0c8ab957290d2262d04d0fde58e928cf08..e3be7122aea610b118875b24cf5762f74db774b9 100644 (file)
@@ -363,6 +363,7 @@ void ShareModel::initShareManager()
     if (_manager.isNull() && sharingPossible) {
         _manager.reset(new ShareManager(_accountState->account(), this));
         connect(_manager.data(), &ShareManager::sharesFetched, this, &ShareModel::slotSharesFetched);
+        connect(_manager.data(), &ShareManager::sharedWithMeFetched, this, &ShareModel::slotSharedWithMeFetched);
         connect(_manager.data(), &ShareManager::shareCreated, this, [&] {
             _manager->fetchShares(_sharePath);
         });
@@ -379,6 +380,7 @@ void ShareModel::initShareManager()
         });
 
         _manager->fetchShares(_sharePath);
+        _manager->fetchSharedWithMe(_sharePath);
     }
 }
 
@@ -493,38 +495,13 @@ void ShareModel::slotSharesFetched(const QList<SharePtr> &shares)
     qCInfo(lcSharing) << "Fetched" << shares.count() << "shares";
 
     for (const auto &share : shares) {
-        if (share.isNull()) {
+        if (share.isNull() ||
+            share->account().isNull() ||
+            share->getUidOwner() != share->account()->davUser()) {
             continue;
-        } else if (const auto selfUserId = share->account()->davUser(); share->getUidOwner() != selfUserId) {
-            _displayShareOwner = true;
-            Q_EMIT displayShareOwnerChanged();
-            _shareOwnerDisplayName = share->getOwnerDisplayName();
-            Q_EMIT shareOwnerDisplayNameChanged();
-            _shareOwnerAvatar = "image://avatars/user-id="
-                + share->getUidOwner()
-                + "/local-account:"
-                + share->account()->displayName();
-            Q_EMIT shareOwnerAvatarChanged();
-
-            if (share->getShareType() == Share::TypeUser &&
-                share->getShareWith() &&
-                share->getShareWith()->shareWith() == selfUserId)
-            {
-                const auto userShare = share.objectCast<UserGroupShare>();
-                const auto expireDate = userShare->getExpireDate();
-                const auto daysToExpire = QDate::currentDate().daysTo(expireDate);
-                _sharedWithMeExpires = expireDate.isValid();
-                Q_EMIT sharedWithMeExpiresChanged();
-                _sharedWithMeRemainingTimeString = daysToExpire > 1
-                    ? tr("%1 days").arg(daysToExpire)
-                    :  daysToExpire > 0
-                        ? tr("1 day")
-                        : tr("Today");
-                Q_EMIT sharedWithMeRemainingTimeStringChanged();
-            }
-        } else {
-            slotAddShare(share);
         }
+
+        slotAddShare(share);
     }
 
     // Perform forward pass on shares and check for duplicate display names; store these indeces so
@@ -565,6 +542,47 @@ void ShareModel::slotSharesFetched(const QList<SharePtr> &shares)
     handleLinkShare();
 }
 
+void ShareModel::slotSharedWithMeFetched(const QList<OCC::SharePtr> &shares)
+{
+    qCInfo(lcSharing) << "Fetched" << shares.count() << "shares that have been shared_with_me";
+
+    for (const auto &share : shares) {
+        if (share.isNull()) {
+            continue;
+        }
+
+        const auto selfUserId = share->account()->davUser();
+        if (share->getUidOwner() == selfUserId) {
+            continue;
+        }
+
+        _displayShareOwner = true;
+        Q_EMIT displayShareOwnerChanged();
+        _shareOwnerDisplayName = share->getOwnerDisplayName();
+        Q_EMIT shareOwnerDisplayNameChanged();
+        _shareOwnerAvatar = QStringLiteral("image://avatars/user-id=%1/local-account:%2")
+            .arg(share->getUidOwner(), share->account()->displayName());
+        Q_EMIT shareOwnerAvatarChanged();
+
+        if (share->getShareType() == Share::TypeUser &&
+            share->getShareWith() &&
+            share->getShareWith()->shareWith() == selfUserId)
+        {
+            const auto userShare = share.objectCast<UserGroupShare>();
+            const auto expireDate = userShare->getExpireDate();
+            const auto daysToExpire = QDate::currentDate().daysTo(expireDate);
+            _sharedWithMeExpires = expireDate.isValid();
+            Q_EMIT sharedWithMeExpiresChanged();
+            _sharedWithMeRemainingTimeString = daysToExpire > 1
+                ? tr("%1 days").arg(daysToExpire)
+                :  daysToExpire == 1
+                    ? tr("1 day")
+                    : tr("Today");
+            Q_EMIT sharedWithMeRemainingTimeStringChanged();
+        }
+    }
+}
+
 void ShareModel::setupInternalLinkShare()
 {
     if (!_accountState ||
index e34dece4b1f9deb0dbe6dc18f0e59332dd2a45f2..12b262bde7a5a00a295d2c07024b1c042f21acb6 100644 (file)
@@ -219,6 +219,7 @@ private slots:
     void slotAddShare(const OCC::SharePtr &share);
     void slotRemoveShareWithId(const QString &shareId);
     void slotSharesFetched(const QList<OCC::SharePtr> &shares);
+    void slotSharedWithMeFetched(const QList<OCC::SharePtr> &shares);
     void slotAddSharee(const OCC::ShareePtr &sharee);
     void slotRemoveSharee(const OCC::ShareePtr &sharee);
 
index 3f2236c3e853277c6daf865bfe0cf94aa1560656..eb69505b2fd16d6277085a2b46fb9142168eb9f5 100644 (file)
@@ -34,7 +34,6 @@ void OcsShareJob::getShares(const QString &path, const QMap<QString, QString> &p
 
     addParam(QString::fromLatin1("path"), path);
     addParam(QString::fromLatin1("reshares"), QStringLiteral("true"));
-    addParam(QString::fromLatin1("shared_with_me"), QStringLiteral("true"));
 
     for (auto it = std::cbegin(params); it != std::cend(params); ++it) {
         addParam(it.key(), it.value());
@@ -208,10 +207,13 @@ void OcsShareJob::createShare(const QString &path,
     start();
 }
 
-void OcsShareJob::getSharedWithMe()
+void OcsShareJob::getSharedWithMe(const QString &path)
 {
     setVerb("GET");
-    addParam(QLatin1String("shared_with_me"), QLatin1String("true"));
+
+    addParam(QString::fromLatin1("path"), path);
+    addParam(QString::fromLatin1("shared_with_me"), QStringLiteral("true"));
+
     start();
 }
 
index 2abaf80a40d48064798c0c75a146dc1b031bdd11..71e0883a7d63a487c82ea16d7ffcdcc7d518f782 100644 (file)
@@ -135,8 +135,9 @@ public:
 
     /**
      * Returns information on the items shared with the current user.
+     * @param path Path to request shares for (default all shares)
      */
-    void getSharedWithMe();
+    void getSharedWithMe(const QString &path = "");
 
     static const QString _pathForSharesRequest;
 
index d025d629f87a6afbc14a9b768ab10088e92671d9..8065db43d79d3ef0a4386c112fce12ec7f0bcba2 100644 (file)
@@ -536,13 +536,21 @@ void ShareManager::slotShareCreated(const QJsonDocument &reply)
 
 void ShareManager::fetchShares(const QString &path)
 {
-    auto *job = new OcsShareJob(_account);
+    const auto job = new OcsShareJob(_account);
     connect(job, &OcsShareJob::shareJobFinished, this, &ShareManager::slotSharesFetched);
     connect(job, &OcsJob::ocsError, this, &ShareManager::slotOcsError);
     job->getShares(path);
 }
 
-void ShareManager::slotSharesFetched(const QJsonDocument &reply)
+void ShareManager::fetchSharedWithMe(const QString &path)
+{
+    const auto sharedWithMeJob = new OcsShareJob(_account);
+    connect(sharedWithMeJob, &OcsShareJob::shareJobFinished, this, &ShareManager::slotSharedWithMeFetched);
+    connect(sharedWithMeJob, &OcsJob::ocsError, this, &ShareManager::slotOcsError);
+    sharedWithMeJob->getSharedWithMe(path);
+}
+
+const QList<SharePtr> ShareManager::parseShares(const QJsonDocument &reply) const
 {
     qDebug() << reply;
     auto tmpShares = reply.object().value("ocs").toObject().value("data").toArray();
@@ -570,10 +578,22 @@ void ShareManager::slotSharesFetched(const QJsonDocument &reply)
     }
 
     qCDebug(lcSharing) << "Sending " << shares.count() << "shares";
+    return shares;
+}
+
+void ShareManager::slotSharesFetched(const QJsonDocument &reply)
+{
+    const auto shares = parseShares(reply);
     emit sharesFetched(shares);
 }
 
-QSharedPointer<UserGroupShare> ShareManager::parseUserGroupShare(const QJsonObject &data)
+void ShareManager::slotSharedWithMeFetched(const QJsonDocument &reply)
+{
+    const auto shares = parseShares(reply);
+    emit sharedWithMeFetched(shares);
+}
+
+QSharedPointer<UserGroupShare> ShareManager::parseUserGroupShare(const QJsonObject &data) const
 {
     ShareePtr sharee(new Sharee(data.value("share_with").toString(),
         data.value("share_with_displayname").toString(),
@@ -602,7 +622,7 @@ QSharedPointer<UserGroupShare> ShareManager::parseUserGroupShare(const QJsonObje
         note));
 }
 
-QSharedPointer<LinkShare> ShareManager::parseLinkShare(const QJsonObject &data)
+QSharedPointer<LinkShare> ShareManager::parseLinkShare(const QJsonObject &data) const
 {
     QUrl url;
 
index e68620e315500b0be45225eff2fba21d99e15832..1cb51df467f30f05f244d8710b49ecf9901554a5 100644 (file)
@@ -440,10 +440,21 @@ public:
      */
     void fetchShares(const QString &path);
 
+    /**
+     * Fetch shares with the current user for path
+     *
+     * @param path The path to get the shares for relative to the users folder on the server
+     *
+     * On success the sharedWithMeFetched signal is emitted
+     * In case of a server error the serverError signal is emitted
+     */
+    void fetchSharedWithMe(const QString &path);
+
 signals:
     void shareCreated(const OCC::SharePtr &share);
     void linkShareCreated(const QSharedPointer<OCC::LinkShare> &share);
     void sharesFetched(const QList<OCC::SharePtr> &shares);
+    void sharedWithMeFetched(const QList<OCC::SharePtr> &shares);
     void serverError(int code, const QString &message);
 
     /** Emitted when creating a link share with password fails.
@@ -456,15 +467,17 @@ signals:
 
 private slots:
     void slotSharesFetched(const QJsonDocument &reply);
+    void slotSharedWithMeFetched(const QJsonDocument &reply);
     void slotLinkShareCreated(const QJsonDocument &reply);
     void slotShareCreated(const QJsonDocument &reply);
     void slotOcsError(int statusCode, const QString &message);
     void slotCreateE2eeShareJobFinised(int statusCode, const QString &message);
 
 private:
-    QSharedPointer<LinkShare> parseLinkShare(const QJsonObject &data);
-    QSharedPointer<UserGroupShare> parseUserGroupShare(const QJsonObject &data);
+    QSharedPointer<LinkShare> parseLinkShare(const QJsonObject &data) const;
+    QSharedPointer<UserGroupShare> parseUserGroupShare(const QJsonObject &data) const;
     SharePtr parseShare(const QJsonObject &data) const;
+    const QList<OCC::SharePtr> parseShares(const QJsonDocument &reply) const;
 
     AccountPtr _account;
 };